繼前兩天章節 Day28 使用M3的Motion - Transition Patterns四種模式,其中的Container transform patterns (1)、Day29 使用M3的Motion - Shared axis(2)。
今天最後一天所以將Motion的Transition Patterms最後兩個模式Fade through 、Fade簡單的使用。
由於MaterialFadeThrough是一個Visibility transition,MaterialFadeThrough能夠根據目標View的出現或消失來適當動畫。
Activity 和 Window過渡需要使用com.google.android.material.transition.platform
提供的Android框架Transition,並且只能在API級別21及更高版本上可用。
準備兩個Class,和兩個 layout
1.設定Enable Activity Transitions,跟前兩章節一樣設定方式有兩種
android:windowActivityTransitions
window.requestFeature(Window.FEATUREACTIVITY_TRANSITIONS)
override fun onCreate(savedInstanceState: Bundle?) {
window.exitTransition = MaterialFadeThrough().apply {
// 指定動畫效果的layout id
addTarget(R.id.a_container)
}
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_a)
}
override fun onCreate(savedInstanceState: Bundle?) {
window.enterTransition = MaterialFadeThrough().apply {
addTarget(R.id.b_container)
}
// ActivityA 和 ActivityB 的動畫效果重疊,預設為True
// 當為 true 時,ActivityA轉換完成後再開始ActivityB
// 當為 false 時,轉換將不等到ActivityA退出轉換完成後再開始ActivityB
window.allowEnterTransitionOverlap = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_b)
...
}
val bundle = ActivityOptions.makeSceneTransitionAnimation(this).toBundle()
startActivity(Intent(this, ActivityB::class.java), bundle)
準備兩個Class,和兩個 layout
FragmentA.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 設定頁面被關閉時動畫
exitTransition = MaterialFadeThrough()
}
FragmentB.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 設定頁面被開啟時的動畫
enterTransition = MaterialFadeThrough()
}
Fragment A 開啟到 FragmentB
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container, FragmentB())
.commit()
Fade through attributes
Fade through slide variant
Fade through 組成
Examples
以下程式將在Fragment之間建立 fades,FragmentA使用切換到FragmentB的預設動畫效果。
可以查看源碼,在建立MaterialFadeThrough時會有預設建立動畫輔助效果
public MaterialFadeThrough() {
super(createPrimaryAnimatorProvider(), createSecondaryAnimatorProvider());
}
private static FadeThroughProvider createPrimaryAnimatorProvider() {
return new FadeThroughProvider();
}
private static VisibilityAnimatorProvider createSecondaryAnimatorProvider() {
ScaleProvider scaleProvider = new ScaleProvider();
scaleProvider.setScaleOnDisappear(false);
scaleProvider.setIncomingStartScale(DEFAULT_START_SCALE);
return scaleProvider;
}
FragmentA.kt設定secondaryAnimatorProvider = null
,將原本預設建立動畫效果移除
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
exitTransition = MaterialFadeThrough().apply {
// 移除原本的 fades 預設建立動畫效果
secondaryAnimatorProvider = null
// 替換線性的底部滑出效果
secondaryAnimatorProvider = SlideDistanceProvider(Gravity.BOTTOM)
}
}
此模式用於在螢幕範圍內進入或退出的UI元素,例如在螢幕中央淡出的對話方塊。
MaterialFade 是 Visibility transition,當目標View的Visibility發生變化、新增或刪除View時,會觸發Visibility transition 以觸發其動畫。
使用MaterialFade為FAB的visibility的View.VISIBL
或View.GONE
,以及設定變化秒數duration
,製成一個簡單的Visibility transition動畫。
showButton.setOnClickListener {
val materialFade = MaterialFade().apply {
duration = 150L
}
TransitionManager.beginDelayedTransition(container, materialFade)
fab.visibility = View.VISIBLE
}
hideButton.setOnClickListener {
val materialFade = MaterialFade().apply {
duration = 84L
}
TransitionManager.beginDelayedTransition(container, materialFade)
fab.visibility = View.GONE
}
Fade 組成
Fade through attributes
感謝耐心的看完~~
今天是最後一天,感謝這30天的堅持,讓我充實了 Materal Design Components,就用目前還是很新的Motion做收尾,最後希望文章能夠持續被關注,同時也希望能夠與閱讀文章者有所互動,真的很歡迎留言指教。
最後對Motion有興趣的,可以使用官方提供的Codelab完整實作教學,跟著實作功力還能不大增嗎~~
https://codelabs.developers.google.com/codelabs/material-motion-android#3
參考資料: Material Design Motion